/** * UnitsHelper.java This file is part of WattDepot. * * Copyright (C) 2013 Cam Moore * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.wattdepot.common.util; import java.io.UnsupportedEncodingException; import java.text.Normalizer; import java.util.HashMap; import java.util.Map; import java.util.regex.Pattern; import javax.measure.unit.NonSI; import javax.measure.unit.SI; import javax.measure.unit.Unit; import javax.measure.unit.UnitFormat; /** * UnitsHelper - Utility class that helps build measurement types. * * @author Cam Moore * */ public class UnitsHelper { /** Holds the defined units. */ public static final Map<String, Unit<?>> quantities = new HashMap<String, Unit<?>>(); static { UnitFormat format = UnitFormat.getInstance(); format.alias(SI.MICRO(SI.GRAM.divide(NonSI.LITER)), "ppm"); format.label(SI.MICRO(SI.GRAM.divide(NonSI.LITER)), "ppm"); quantities.put(buildName("Power", SI.WATT), SI.WATT); quantities.put(buildName("Energy", SI.WATT.times(NonSI.HOUR)), SI.WATT.times(NonSI.HOUR)); quantities.put(buildName("Energy", SI.KILO(SI.WATT).times(NonSI.HOUR)), SI.KILO(SI.WATT).times(NonSI.HOUR)); quantities.put(buildName("Frequency", SI.HERTZ), SI.HERTZ); quantities.put(buildName("Temperature", NonSI.FAHRENHEIT), NonSI.FAHRENHEIT); quantities.put(buildName("Temperature", SI.CELSIUS), SI.CELSIUS); quantities.put(buildName("Volume", NonSI.GALLON_LIQUID_US), NonSI.GALLON_LIQUID_US); quantities.put(buildName("Volume", NonSI.LITER), NonSI.LITER); quantities.put(buildName("Volume", SI.CUBIC_METRE), SI.CUBIC_METRE); quantities.put(buildName("Flow Rate", NonSI.GALLON_LIQUID_US.divide(SI.SECOND)), NonSI.GALLON_LIQUID_US.divide(SI.SECOND)); quantities.put(buildName("Flow Rate", NonSI.LITER.divide(SI.SECOND)), NonSI.LITER.divide(SI.SECOND)); quantities.put(buildName("Flow Rate", NonSI.LITER.divide(NonSI.MINUTE)), NonSI.LITER.divide(NonSI.MINUTE)); quantities.put(buildName("Mass", SI.KILOGRAM), SI.KILOGRAM); quantities.put(buildName("Mass", NonSI.POUND), NonSI.POUND); quantities.put(buildName("Humidity", NonSI.PERCENT), NonSI.PERCENT); quantities.put(buildName("Concentration", SI.MICRO(SI.GRAM.divide(NonSI.LITER))), SI.MICRO(SI.GRAM.divide(NonSI.LITER))); quantities.put(buildName("Cloud Coverage", NonSI.PERCENT), NonSI.PERCENT); quantities.put(buildName("Area", SI.SQUARE_METRE), SI.SQUARE_METRE); quantities.put(buildName("Area", NonSI.FOOT.times(NonSI.FOOT)), NonSI.FOOT.times(NonSI.FOOT)); } /** * @param type * The type of the unit, Energy, Power, Mass, etc. * @param unit * The Unit<?>. * @return The name. */ public static String buildName(String type, Unit<?> unit) { String s = unit.toString(); String s1 = Normalizer.normalize(s, Normalizer.Form.NFKD); String regex = Pattern.quote("[\\p{InCombiningDiacriticalMarks}\\p{IsLm}\\p{IsSk}]+"); try { String s2 = new String(s1.replaceAll(regex, "").getBytes("ascii"), "ascii"); s2 = s2.replace("?", ""); return type + " (" + s2 + ")"; } catch (UnsupportedEncodingException e) { // NOPMD // Don't know what to do so just returning s1. } return type + " (" + s1 + ")"; } }